from flask import Flask, request, jsonify
from flask_cors import CORS
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
import os
import base64
import requests
import json
import io
app = Flask(__name__)
CORS(app)

# 设置 OpenAI API 密钥，参考 min3.py 进行修改
os.environ["OPENAI_API_KEY"] = "sk-fhfopxxokpblqjbivoyhwhftlbjwrgeddccbytodqipkaqum"
base_url = "https://api.siliconflow.cn/v1"
# 配置 SiliconFlow 的 OpenAI 兼容 API
llm = OpenAI(
    openai_api_base=base_url,
    api_key=os.environ.get("OPENAI_API_KEY"),
    #model_name="THUDM/GLM-4-32B-0414",
    model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
    temperature=0.7,
    top_p=0.1,
    max_tokens=1024
)

# 定义Prompt
prompt_template = "请检查以下小学算数题目是否有错题，如果有，请指出错题并说明错误原因。如果没有，请回复没有错题。题目如下：\n{image_text}"
PROMPT = PromptTemplate(template=prompt_template, input_variables=["image_text"])


pic_prompt = """# 角色：

# 角色：
智能错题识别员

# 简介：
能快速识别图片中的错题，具备图像识别和学科知识判断能力。

# 技能：
运用图像识别技术提取文字和题目信息；依据学科知识判断对错。

# 规则：
严格按学科标准判断；准确标注错题；若无错题回答不知道。

工作流程：
1. 接收并检查图片质量。
2. 识别图片中的题目信息。
3. 判断并标记错题；若无错题则回答不知道。

# 输出格式：
{{
    "total_questions": 总题目数量,
    "wrong_questions": [
        {{
            "question_number": 题目序号,
            "question_content": 题目内容,
            "error_reason": 错误原因
        }},
        ...
        或者"answer": "不知道"
    ]
}}
"""

def cuoti():
    try:
        if 'image' not in request.files:
            return jsonify({'status': 'error', 'message': 'No image part'}), 400
        image = request.files['image']
        base64_image = image_to_base64(image)
        print(base64_image)
        # # 示例代码，假设已经获取到图片文本
        # image_text = "示例文本"
        # final_prompt = PROMPT.format(image_text=image_text)
        # result = llm(final_prompt)
        resp = analyze_image_with_qwen(os.environ.get("OPENAI_API_KEY"), base64_image, pic_prompt)
        print("Response from API:", resp.json())
        print(f"响应状态码: {resp.status_code}")
        resp_json = resp.json()
        content = resp_json['choices'][0]['message']['content']
        start_index = content.find('```json') + len('```json')
        end_index = content.find('```', start_index)
        json_content = content[start_index:end_index].strip()

        end = content.find('```json')
        analyzeContent = content[0:end-len('```json')-4].strip()
        
        try:
            result = json.loads(json_content)
            print(f"最终解析的JSON数据: {result}")
            return {'status': 'success', 'data': result , 'analyzeContent': analyzeContent}  # 假设返回的是一个字典，你可以根据实际情况调整返回格式
        except json.JSONDecodeError as e:
            print(f"JSON解析错误: {e}")
            return jsonify({{'status': 'error', 'message': 'JSON解析失败'}}), 500
        #return jsonify({'status': 'success', 'data': result})
    except Exception as e:
        return jsonify({'status': 'error', 'message': str(e)}), 500



def image_to_base64(image):
    # Convert image file to base64 string
    image_bytes = image.read()
    base64_encoded = base64.b64encode(image_bytes).decode('utf-8')
    return base64_encoded                # 这里需要添加图片识别的代码，将图片转换为文本



# 2. 构造API请求
def analyze_image_with_qwen(api_key, image_base64, prompt):
    url = "https://api.siliconflow.cn/v1/chat/completions"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    }
    payload = {
        "model": "Qwen/Qwen2.5-VL-32B-Instruct",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/jpeg;base64,{image_base64}"
                        }
                    }
                ]
            }
        ],
        "max_tokens": 4096,  # 可根据需要调整
    }
    response = requests.post(url, headers=headers, json=payload)
    return response



if __name__ == '__main__':
    app.run(debug=True)
